Mô đun:ImprovementTableKai
local BaseTable = require('Module:BaseTable') local Equipment = require('Module:Equipment') local Formatting = require('Module:Formatting') local ResourceIcons = require('Module:ResourceIcons') local Ship = require('Module:Ship') local format = require('Module:StringInterpolation').format local ImprovementTableKai = BaseTable{ _item_class = Equipment, _header_template = ${resources} ! style="text-align: center; padding: 5px;" | ★ ! style="text-align: center; padding: 5px;" | ${devmat} ! style="text-align: center; padding: 5px;" | ${screw} ! style="text-align: center; padding: 5px;" | S ! style="text-align: center; padding: 5px;" | M ! style="text-align: center; padding: 5px;" | T ! style="text-align: center; padding: 5px;" | W ! style="text-align: center; padding: 5px;" | T ! style="text-align: center; padding: 5px;" | F ! style="text-align: center; padding: 5px;" | S ! style="text-align: center; padding: 5px;" | Helper Ship, _column_cell_templates = { name = [[| colspan="${colspan}" rowspan="${rowspan}" style="text-align: ${text_align}; background-color: ${bg_color}; padding:5px 5px 5px 5px;" |${values.name} ${values.icon} ${values.japanese_name}]] }, _columns = { "input_output", "improvement_level", "development_material", "improvement_material", "sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "helper_ships", }, _improvement_brackets = { 0, 6, 10 }, _caption_template = [[|+ style="position: relative;" | ${icon}${name}${edit_link}]], _name_custom_row_template = ${icon}${name}: ${resources}${edit_link} , _edit_link_text = "Edit", _equipment_data_documentation = "Template:EquipmentDataDocumentation/EditIntro", _basic_resources_label = "Improvement Cost: ", _consumed_equipment_label = "Consumes: ${list}", _produced_equipment_label = "Produces: 1x ${icon}${name}${stars}", _produced_equipment_stars_template = "★+${stars}", _equipment_item = "${count}x ${icon}${name}", _material_cell_content = "${normal}/${slider}", _unavailable_color = "#f99", _available_color = "#aaebaa", _small_icon_size = "24x24px", _combined_names_template = "${text} (${combined_text})", } function ImprovementTableKai:create_items_post() self._custom_rows = {} local result = {} if #self._items 1 then self._single_item = true end for item_index, item in ipairs(self._items) do if type(item) ~= "string" then local products = item:improvement_products() local edit_link = Formatting:format_edit_link(Equipment:get_module(self._argsitem_index), self._edit_link_text, self._equipment_data_documentation) if self._single_item then self._title_row = format{self._caption_template, icon = Formatting:format_image{Formatting:format_equipment_icon(item:icon())}, name = Formatting:format_link(item:link()), edit_link = edit_link, } else self._custom_rowsitem:name() = format{self._name_custom_row_template, icon = Formatting:format_image{Formatting:format_equipment_icon(item:icon())}, name = Formatting:format_link(item:link()), resources = Formatting:format_resources(item:improvement_resources() or {devmat = false, screw = false}), edit_link = edit_link, } table.insert(result, item:name()) end if products then for _, product in ipairs(products) do local ships = item:improvement_ships(product) local availability = {} local ship_data = {} for _, ship in ipairs(ships) do availabilityship = item:improvement_availability(product, ship) if type(ship) "string" then ship_dataship = Ship(ship) end end local combined_ships = {} local indexes_to_delete = {} local ship_names = {} for index, ship in ipairs(ships) do if ship ~= true then local remodel_from = ship_dataship:remodel_from() if ship_dataremodel_from then local identical = true for day, possible in pairs(availabilityship) do if availabilityremodel_fromday ~= possible then identical = false end end if identical then table.insert(indexes_to_delete, index) -- The text to add when combining with a less remodelled form. local combined_name if ship_dataremodel_from:base_name() ship_dataship:base_name() then -- The ship has the same base name as the preceding form, -- so we only need to add the suffix. combined_name = ship_dataship:display_suffix() else -- The ship has a different base name as the preceding form, -- so we need to add the full name. combined_name = ship_dataship:name() end -- Find the most basic form while combined_shipsremodel_from do remodel_from = combined_shipsremodel_from end -- Leave a marker that we combined this form with another form combined_shipsship = remodel_from -- Prevent nil errors if not ship_namesremodel_from then ship_namesremodel_from = {} end -- Add the combine text to a table so it can be displayed with the most basic form later table.insert(ship_namesremodel_from, combined_name) if ship_namesship then -- If this form has had other forms combined with it, add those forms' text too -- This order of operations should keep the combined text readable. for _, suffix in ipairs(ship_namesship) do table.insert(ship_namesremodel_from, suffix) end ship_namesship = nil end end end end end table.sort(indexes_to_delete, function(a,b) return a > b end) for _, index in ipairs(indexes_to_delete) do table.remove(ships, index) end for _, stars in ipairs(item:improvement_brackets(product)) do table.insert(result, {item = item, product = product, stars = stars, ships = ships, ship_data = ship_data, ship_names = ship_names, availability = availability, resources = item:improvement_resources(false, product, stars), resources_x = item:improvement_resources(true, product, stars)}) end end else table.insert(result, {item = item, stars = nil}) end end end self._items = result end function ImprovementTableKai:input_output(row_data) local value = "-" if row_data.resources then local result = {} local consumed_equipment_table = row_data.resources.equipment or {} local consumed_equipment = {} for equip, count in pairs(consumed_equipment_table) do local equipment = equip ~= true and Equipment(equip) or row_data.item table.insert(consumed_equipment, format{self._equipment_item, count = count, icon = Formatting:format_image{Formatting:format_equipment_icon_simple(equipment:icon()), size = self._small_icon_size}, name = equip true and Formatting:format_stat(equipment:name()) or Formatting:format_link(equipment:link())}) end if #consumed_equipment > 0 then table.insert(result, format{self._consumed_equipment_label, list = table.concat(consumed_equipment, " ")}) end if row_data.stars self._improvement_brackets#self._improvement_brackets and row_data.product then local product = Equipment(row_data.product) local stars = row_data.item:improvement_product_initial_level(row_data.product) table.insert(result, format{self._produced_equipment_label, icon = Formatting:format_image{Formatting:format_equipment_icon_simple(product:icon()), size = self._small_icon_size}, name = Formatting:format_link(product:link()), stars = stars and format{self._produced_equipment_stars_template, stars = stars} or "" }) end if #result > 0 then value = table.concat(result, " ") end end return {values = {value = value}, bg_color = self._transparent, text_align = self._center_align} end function ImprovementTableKai:improvement_level(row_data) return {values = {value = row_data.stars or "-"}, bg_color = self._transparent, text_align = self._center_align} end function ImprovementTableKai:development_material(row_data) if row_data.resources then return {values = {value = format{self._material_cell_content, normal = row_data.resources.devmat, slider = row_data.resources_x.devmat}}, bg_color = self._transparent, text_align = self._center_align} else return {values = {value = "-"}, bg_color = self._transparent, text_align = self._center_align} end end function ImprovementTableKai:improvement_material(row_data) if row_data.resources then return {values = {value = format{self._material_cell_content, normal = row_data.resources.screw, slider = row_data.resources_x.screw}}, bg_color = self._transparent, text_align = self._center_align} else return {values = {value = "-"}, bg_color = self._transparent, text_align = self._center_align} end end function ImprovementTableKai:sunday(row_data) return self:availability(row_data, "Sunday") end function ImprovementTableKai:monday(row_data) return self:availability(row_data, "Monday") end function ImprovementTableKai:tuesday(row_data) return self:availability(row_data, "Tuesday") end function ImprovementTableKai:wednesday(row_data) return self:availability(row_data, "Wednesday") end function ImprovementTableKai:thursday(row_data) return self:availability(row_data, "Thursday") end function ImprovementTableKai:friday(row_data) return self:availability(row_data, "Friday") end function ImprovementTableKai:saturday(row_data) return self:availability(row_data, "Saturday") end function ImprovementTableKai:availability(row_data, day) local availability = {} local available = false if row_data.ships then for index, ship in ipairs(row_data.ships) do if row_data.availabilityshipday then available = true local ship_initial if ship ~= true then ship_initial = mw.ustring.sub(row_data.ship_dataship:name(), 1, 1) else ship_initial = "✓" end table.insert(availability, ship_initial) else table.insert(availability, " ") end end end return {values = {value = available and table.concat(availability, " ") or "✗"}, bg_color = available and self._available_color or self._unavailable_color, text_align = self._center_align} end function ImprovementTableKai:helper_ships(row_data) local ships = {} if row_data.ships then for index, ship in ipairs(row_data.ships) do if ship ~= true then link, text, section = row_data.ship_dataship:link() if row_data.ship_namesship then text = format{self._combined_names_template, text = text or link, combined_text = table.concat(row_data.ship_namesship, "/")} end table.insert(ships, Formatting:format_link(link, text, section)) else table.insert(ships, "Any") end end end return {values = {value = table.concat(ships, " ")}, bg_color = self._transparent, text_align = self._center_align} end function ImprovementTableKai:start_rows() if self._single_item then self._rows = {self._table_start, self._title_row, self._header} else self._rows = {self._table_start, self._header} end end function ImprovementTableKai:create_table_prep() self._header_icons = { devmat = ResourceIcons.devmat, screw = ResourceIcons.screw, } for key, value in pairs(self._header_icons) do self._header_iconskey = Formatting:format_image{value, caption = Formatting:format_resource_name(key)} end end function ImprovementTableKai:create_header() if self._single_item then self._header_icons.resources = self._basic_resources_label .. Formatting:format_resources(self._items1.item:improvement_resources() or {devmat = false, screw = false}) else self._header_icons.resources = "" end self._header = format(self._header_template, self._header_icons) end function ImprovementTableKai:finish_rows() if not self._single_item then table.insert(self._rows, self._row_starter) table.insert(self._rows, self._header_bottom or self._header) end table.insert(self._rows, self._table_end) end ImprovementTableKai.create_data_rows = ImprovementTableKai.create_data_rows_merge_vertical return ImprovementTableKai